package proceso.carga.malla;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;


import modelo.red.Atributo;
import modelo.red.Malla;
import modelo.regionRiego.RegionRiego;

/**
 * 
 * @author edgar
 * Almacena solo una malla que no tenga errores en la lectura. No garantiza que los datos sean validos.
 * Estructura del archivo de entrada
 * Tipo de archivo
 * nroColoumnas NroFilas
 * EsteMinimo EsteMaximo
 * NorteMinimo NorteMaximo
 * CotaMinima CotaMaxima
 * Grupos de 10 datos con una ultima linea con los datos faltantes de la fila seguido de una linea en blanco.
 * 
 * Se verifica que el nombre de la malla no exista. Si existe no se crea la malla, se verifica el atributo si es el
 * mismo atributo, no se cargan los datos. Si es un atributo nuevo y la estructura es la misma, se cargan los datos 
 * para el nuevo atributo.
 * 
 * Los datos son leidos mediante la clase LectorMallaSurfer
 * 
 */

public class CargadorDeMalla {
	private String nombreDelArchivo;
	private String nombreDeLaMalla;
	private String atributoLeido;
	private Malla malla;
	private Atributo atributo;
	private String error = "";
	private boolean resultado;
	public String getNombreDelArchivo() {
		return nombreDelArchivo;
	}
	public void setNombreDelArchivo(String nombreDelArchivo) {
		this.nombreDelArchivo = nombreDelArchivo;
	}
	public String getNombreDeLaMalla() {
		return nombreDeLaMalla;
	}
	public void setNombreDeLaMalla(String nombreDeLaMalla) {
		this.nombreDeLaMalla = nombreDeLaMalla;
	}
	public String getAtributoLeido() {
		return atributoLeido;
	}
	public void setAtributoLeido(String atributoLeido) {
		this.atributoLeido = atributoLeido;
	}
	public Malla getMalla() {
		return malla;
	}
	public void setMalla(Malla malla) {
		this.malla = malla;
	}
	public Atributo getAtributo() {
		return atributo;
	}
	public void setAtributo(Atributo atributo) {
		this.atributo = atributo;
	}
	public String getError() {
		return error;
	}
	public void setError(String error) {
		this.error = error;
	}
	public boolean isResultado() {
		return resultado;
	}
	public void setResultado(boolean resultado) {
		this.resultado = resultado;
	}
	
	public boolean cargarMalla(Session sess, RegionRiego regionRiego, int tipoMalla){
		
		List<Atributo> listaAtributo;
		List<Malla> listaMalla;
 		boolean atributoNuevo = false;
 		boolean mallaNueva = false;
		boolean lectura;
		LectorMallaSurfer lector;
		Query q;
		
		
		lector = new LectorMallaSurfer();

		
		q = sess.createQuery("from Atributo as a where a.nombre like :atributo ");
		q.setParameter("atributo", atributoLeido);
		listaAtributo = q.list();
		if(listaAtributo.size()==0){
			atributo = new Atributo();
			atributo.setNombre(atributoLeido);
			atributoNuevo = true;
		}
		else{
			atributo = listaAtributo.get(0);
		}
		lector.setAtributo(atributo);
		
		q = sess.createQuery("from Malla as m where m.nombre like :nombreMalla");
		q.setParameter("nombreMalla", nombreDeLaMalla);
		listaMalla = q.list();
		if(listaMalla.size() == 1) {
			lector.setMalla(listaMalla.get(0));
			// revisar si esta malla tiene el atributo
			if(!atributoNuevo) {
				boolean tieneAtributo = false;
				for(int i =0; i<listaMalla.get(0).getListaAtributo().size();i++) {
					if(listaMalla.get(0).getListaAtributo().get(i).getAtributo().equals(atributo)){
						tieneAtributo = true;
						error += "La malla existe con ese atributo";
						return false;
					}
				}
			}
		}
		else {
			lector.setMalla(null);
			lector.setNombreMalla(nombreDeLaMalla);
			mallaNueva = true;
		}
		lector.setMallaNueva(mallaNueva);
		
		lector.setArchivoDeEntrada(nombreDelArchivo);
		lectura = lector.leerArchivo();
		if(lectura) {
			if(atributoNuevo){
				sess.save(atributo);
			}
			lector.getMalla().setRegionRiego(regionRiego);
			lector.getMalla().setTipo(tipoMalla);
			sess.save(lector.getMalla());
			lector.getMalla().getListaAtributo().get(0).setAtributo(atributo);
			sess.save(lector.getMalla().getListaAtributo().get(0));
			if(mallaNueva){
				int cantidad = 0;
				sess.save(lector.getMalla());
				
				for(int i = 0; i<lector.getMalla().getEjeNorteSur().size();i++) {
					sess.save(lector.getMalla().getEjeNorteSur().get(i));
				}
				
				for(int i = 0; i<lector.getMalla().getEjeEsteOeste().size();i++) {
					sess.save(lector.getMalla().getEjeEsteOeste().get(i));
				}
				sess.flush();
				sess.clear();
			}
			int cantidad = 0;
			for(int i =0; i< lector.getMalla().getListaPunto().size(); i++ ) {
				sess.save(lector.getMalla().getListaPunto().get(i));
				cantidad++;
				if(cantidad == 50000) {
					cantidad = 0;
					sess.flush();
					sess.clear();
					System.out.println("Almacenado el registro " + i);
				}
			}
			sess.flush();
			System.out.println("Almacenados los ultimos registros");			

		}
		else{
			error = lector.getRazon();
			return false;
		}
		
		return true;
		
	}
	
	
}
